蓝桥杯--基础训练 十六进制转八进制

十六进制转八进制(题解)

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式:

输入的第一行为一个正整数n (1<=n<=10)。

接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式:

输出n行,每行为输入对应的八进制正整数。

【注意】

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

输入样例:

1
2
3
2
39
123ABC

输出样例:

1
2
71
4435274

我的代码如下:(WA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <string.h>
char a[100100];
int b[100100];
int main()
{
int n;
long long sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",a);
int len=strlen(a);
for(int i=0;i<len;i++)
{
if(a[i]>='0'&&a[i]<='9')
sum=sum*16+(a[i]-'0');
if(a[i]>='A'&&a[i]<='F')
sum=sum*16+(a[i]-'7');
}
int count=0;
do{
b[count++]=sum%8;
sum=sum/8;
}while(sum>0);
for(int i=count-1;i>=0;i--)
printf("%d",b[i]);
printf("\n");
}
return 0;
}

本地测试能过,结果WA,一直想不明白,题目中提示也是先将十六进制转成某进制,十六进制长度不超过100000,等等,那sum不就超界了么,那就应该十六进制转换成二进制了.

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string.h>
using namespace std;
char a[100100],d[100100];
int main()
{
int n;
char b[16][5]={{"0000"},{"0001"},{"0010"},{"0011"},{"0100"},{"0101"},{"0110"},{"0111"},
{"1000"},{"1001"},{"1010"},{"1011"},{"1100"},{"1101"},{"1110"},{"1111"}};
char c[8][4]={{"000"},{"001"},{"010"},{"011"},{"100"},{"101"},{"110"},{"111"}};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
string two;
scanf("%s",a);
int len=strlen(a);
//将输入的字符逐个转换为二进制,并存储在
for(int i=0;i<len;i++)
{
if(a[i]>='A'&&a[i]<='Z')
two+=b[a[i]-'7'];
else
two+=b[a[i]-'0'];
}
//进行补位,不足3的整数倍需要进行补位
int l=two.length()%3;
if(l==1)
two.insert(0,"00");
if(l==2)
two.insert(0,"0");
int count=0;
//每三位进行匹配,转换为八进制
for(int i=0;i<two.length();i=i+3)
{
for(int j=0;j<9;j++)
if(two.substr(i,3)==c[j])
d[count++]=(j+'0');
}
//前导0不进行输出.
if(d[0]!='0')
cout<<d[0];
for(int i=1;i<count;i++)
cout<<d[i];
cout<<endl;
}
return 0;
}
小礼物走一个哟
0%